//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS ChimeSDKMeetings service.
///
/// The Amazon Chime SDK meetings APIs in this section allow software developers to create Amazon Chime SDK meetings, set the Amazon Web Services Regions for meetings, create and manage users, and send and  receive meeting notifications. For more information about the meeting APIs, see  Amazon Chime SDK meetings.
public struct ChimeSDKMeetings: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the ChimeSDKMeetings client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "ChimeSDKMeetings",
            serviceIdentifier: "meetings-chime",
            signingName: "chime",
            serviceProtocol: .restjson,
            apiVersion: "2021-07-15",
            endpoint: endpoint,
            variantEndpoints: Self.variantEndpoints,
            errorType: ChimeSDKMeetingsErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }




    /// FIPS and dualstack endpoints
    static var variantEndpoints: [EndpointVariantType: AWSServiceConfig.EndpointVariant] {[
        [.fips]: .init(endpoints: [
            "ca-central-1": "meetings-chime-fips.ca-central-1.amazonaws.com",
            "us-east-1": "meetings-chime-fips.us-east-1.amazonaws.com",
            "us-gov-east-1": "meetings-chime-fips.us-gov-east-1.amazonaws.com",
            "us-gov-west-1": "meetings-chime-fips.us-gov-west-1.amazonaws.com",
            "us-west-2": "meetings-chime-fips.us-west-2.amazonaws.com"
        ])
    ]}

    // MARK: API Calls

    /// Creates up to 100 attendees for an active Amazon Chime SDK meeting. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the Amazon Chime Developer Guide.
    @Sendable
    @inlinable
    public func batchCreateAttendee(_ input: BatchCreateAttendeeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> BatchCreateAttendeeResponse {
        try await self.client.execute(
            operation: "BatchCreateAttendee", 
            path: "/meetings/{MeetingId}/attendees?operation=batch-create", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates up to 100 attendees for an active Amazon Chime SDK meeting. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the Amazon Chime Developer Guide.
    ///
    /// Parameters:
    ///   - attendees: The attendee information, including attendees' IDs and join tokens.
    ///   - meetingId: The Amazon Chime SDK ID of the meeting to which you're adding attendees.
    ///   - logger: Logger use during operation
    @inlinable
    public func batchCreateAttendee(
        attendees: [CreateAttendeeRequestItem],
        meetingId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> BatchCreateAttendeeResponse {
        let input = BatchCreateAttendeeRequest(
            attendees: attendees, 
            meetingId: meetingId
        )
        return try await self.batchCreateAttendee(input, logger: logger)
    }

    /// Updates AttendeeCapabilities except the capabilities listed in an ExcludedAttendeeIds table.  You use the capabilities with a set of values that control what the capabilities can do, such as SendReceive data. For more information about those values, see  .  When using capabilities, be aware of these corner cases:   If you specify MeetingFeatures:Video:MaxResolution:None when you create a meeting, all API requests  that include SendReceive, Send, or Receive for AttendeeCapabilities:Video will be rejected with ValidationError 400.   If you specify MeetingFeatures:Content:MaxResolution:None when you create a meeting, all API requests that include SendReceive, Send, or  Receive for AttendeeCapabilities:Content will be rejected with ValidationError 400.   You can't set content capabilities to SendReceive or Receive unless you also set video capabilities to SendReceive  or Receive. If you don't set the video capability to receive, the response will contain an HTTP 400 Bad Request status code. However, you can set your video capability  to receive and you set your content capability to not receive.   If meeting features is defined as Video:MaxResolution:None but Content:MaxResolution is defined as something other than None and attendee capabilities are not defined in the API request, then the default attendee video capability is set to Receive and attendee content capability is set to SendReceive. This is because content SendReceive requires video to be at least Receive.   When you change an audio capability from None or Receive to Send or SendReceive ,  and if the attendee left their microphone unmuted, audio will flow from the attendee to the other meeting participants.   When you change a video or content capability from None or Receive to Send or SendReceive ,  and if the attendee turned on their video or content streams, remote attendees can receive those streams, but only after media renegotiation between the client and the Amazon Chime back-end server.
    @Sendable
    @inlinable
    public func batchUpdateAttendeeCapabilitiesExcept(_ input: BatchUpdateAttendeeCapabilitiesExceptRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "BatchUpdateAttendeeCapabilitiesExcept", 
            path: "/meetings/{MeetingId}/attendees/capabilities?operation=batch-update-except", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates AttendeeCapabilities except the capabilities listed in an ExcludedAttendeeIds table.  You use the capabilities with a set of values that control what the capabilities can do, such as SendReceive data. For more information about those values, see  .  When using capabilities, be aware of these corner cases:   If you specify MeetingFeatures:Video:MaxResolution:None when you create a meeting, all API requests  that include SendReceive, Send, or Receive for AttendeeCapabilities:Video will be rejected with ValidationError 400.   If you specify MeetingFeatures:Content:MaxResolution:None when you create a meeting, all API requests that include SendReceive, Send, or  Receive for AttendeeCapabilities:Content will be rejected with ValidationError 400.   You can't set content capabilities to SendReceive or Receive unless you also set video capabilities to SendReceive  or Receive. If you don't set the video capability to receive, the response will contain an HTTP 400 Bad Request status code. However, you can set your video capability  to receive and you set your content capability to not receive.   If meeting features is defined as Video:MaxResolution:None but Content:MaxResolution is defined as something other than None and attendee capabilities are not defined in the API request, then the default attendee video capability is set to Receive and attendee content capability is set to SendReceive. This is because content SendReceive requires video to be at least Receive.   When you change an audio capability from None or Receive to Send or SendReceive ,  and if the attendee left their microphone unmuted, audio will flow from the attendee to the other meeting participants.   When you change a video or content capability from None or Receive to Send or SendReceive ,  and if the attendee turned on their video or content streams, remote attendees can receive those streams, but only after media renegotiation between the client and the Amazon Chime back-end server.
    ///
    /// Parameters:
    ///   - capabilities: The capabilities (audio, video, or content) that you want to update.
    ///   - excludedAttendeeIds: The AttendeeIDs that you want to exclude from one or more capabilities.
    ///   - meetingId: The ID of the meeting associated with the update request.
    ///   - logger: Logger use during operation
    @inlinable
    public func batchUpdateAttendeeCapabilitiesExcept(
        capabilities: AttendeeCapabilities,
        excludedAttendeeIds: [AttendeeIdItem],
        meetingId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = BatchUpdateAttendeeCapabilitiesExceptRequest(
            capabilities: capabilities, 
            excludedAttendeeIds: excludedAttendeeIds, 
            meetingId: meetingId
        )
        return try await self.batchUpdateAttendeeCapabilitiesExcept(input, logger: logger)
    }

    ///  Creates a new attendee for an active Amazon Chime SDK meeting. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the  Amazon Chime Developer Guide.
    @Sendable
    @inlinable
    public func createAttendee(_ input: CreateAttendeeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateAttendeeResponse {
        try await self.client.execute(
            operation: "CreateAttendee", 
            path: "/meetings/{MeetingId}/attendees", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Creates a new attendee for an active Amazon Chime SDK meeting. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the  Amazon Chime Developer Guide.
    ///
    /// Parameters:
    ///   - capabilities: The capabilities (audio, video, or content) that you want to grant an attendee. If you don't specify capabilities, all users have send and receive capabilities on  all media channels by default.  You use the capabilities with a set of values that control what the capabilities can do, such as SendReceive data. For more information about those values, see  .  When using capabilities, be aware of these corner cases:   If you specify MeetingFeatures:Video:MaxResolution:None when you create a meeting, all API requests  that include SendReceive, Send, or Receive for AttendeeCapabilities:Video will be rejected with ValidationError 400.   If you specify MeetingFeatures:Content:MaxResolution:None when you create a meeting, all API requests that include SendReceive, Send, or  Receive for AttendeeCapabilities:Content will be rejected with ValidationError 400.   You can't set content capabilities to SendReceive or Receive unless you also set video capabilities to SendReceive  or Receive. If you don't set the video capability to receive, the response will contain an HTTP 400 Bad Request status code. However, you can set your video capability  to receive and you set your content capability to not receive.   If meeting features is defined as Video:MaxResolution:None but Content:MaxResolution is defined as something other than None and attendee capabilities are not defined in the API request, then the default attendee video capability is set to Receive and attendee content capability is set to SendReceive. This is because content SendReceive requires video to be at least Receive.   When you change an audio capability from None or Receive to Send or SendReceive ,  and if the attendee left their microphone unmuted, audio will flow from the attendee to the other meeting participants.   When you change a video or content capability from None or Receive to Send or SendReceive ,  and if the attendee turned on their video or content streams, remote attendees can receive those streams, but only after media renegotiation between the client and the Amazon Chime back-end server.
    ///   - externalUserId: The Amazon Chime SDK external user ID. An idempotency token. Links the attendee to an identity managed by a builder application. Pattern: [-_&@+=,(){}\[\]\/«».:|'"#a-zA-Z0-9À-ÿ\s]*  Values that begin with aws: are reserved. You can't configure a value that uses this prefix.
    ///   - meetingId: The unique ID of the meeting.
    ///   - logger: Logger use during operation
    @inlinable
    public func createAttendee(
        capabilities: AttendeeCapabilities? = nil,
        externalUserId: String,
        meetingId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateAttendeeResponse {
        let input = CreateAttendeeRequest(
            capabilities: capabilities, 
            externalUserId: externalUserId, 
            meetingId: meetingId
        )
        return try await self.createAttendee(input, logger: logger)
    }

    /// Creates a new Amazon Chime SDK meeting in the specified media Region with no initial attendees. For more information about specifying media Regions, see  Available Regions and  Using meeting Regions, both  in the Amazon Chime SDK Developer Guide. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the  Amazon Chime SDK Developer Guide.   If you use this API in conjuction with the  and  APIs, and you don't specify the  MeetingFeatures.Content.MaxResolution or MeetingFeatures.Video.MaxResolution parameters, the following defaults are used:   Content.MaxResolution: FHD   Video.MaxResolution: HD
    @Sendable
    @inlinable
    public func createMeeting(_ input: CreateMeetingRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateMeetingResponse {
        try await self.client.execute(
            operation: "CreateMeeting", 
            path: "/meetings", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new Amazon Chime SDK meeting in the specified media Region with no initial attendees. For more information about specifying media Regions, see  Available Regions and  Using meeting Regions, both  in the Amazon Chime SDK Developer Guide. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the  Amazon Chime SDK Developer Guide.   If you use this API in conjuction with the  and  APIs, and you don't specify the  MeetingFeatures.Content.MaxResolution or MeetingFeatures.Video.MaxResolution parameters, the following defaults are used:   Content.MaxResolution: FHD   Video.MaxResolution: HD
    ///
    /// Parameters:
    ///   - clientRequestToken: The unique identifier for the client request. Use a different token for different meetings.
    ///   - externalMeetingId: The external meeting ID. Pattern: [-_&@+=,(){}\[\]\/«».:|'"#a-zA-Z0-9À-ÿ\s]*  Values that begin with aws: are reserved. You can't configure a value that uses this prefix.  Case insensitive.
    ///   - mediaPlacementNetworkType: The type of network for the media placement. Either IPv4 only or dual-stack (IPv4 and IPv6).
    ///   - mediaRegion: The Region in which to create the meeting.  Available values:  af-south-1,  ap-northeast-1,  ap-northeast-2,  ap-south-1,  ap-southeast-1,  ap-southeast-2,            ca-central-1,  eu-central-1,  eu-north-1,  eu-south-1,  eu-west-1,  eu-west-2,  eu-west-3,             sa-east-1,  us-east-1,  us-east-2,  us-west-1,  us-west-2.  Available values in Amazon Web Services GovCloud (US) Regions: us-gov-east-1, us-gov-west-1.
    ///   - meetingFeatures: Lists the audio and video features enabled for a meeting, such as echo reduction.
    ///   - meetingHostId: Reserved.
    ///   - notificationsConfiguration: The configuration for resource targets to receive notifications when meeting and attendee events occur.
    ///   - primaryMeetingId: When specified, replicates the media from the primary meeting to the new meeting.
    ///   - tags: Applies one or more tags to an Amazon Chime SDK meeting. Note the following:   Not all resources have tags. For a list of services with resources that support tagging using this operation, see  Services that support the Resource Groups Tagging API. If the resource  doesn't yet support this operation, the resource's service might support tagging using its own API operations. For more information, refer to the documentation for that service.   Each resource can have up to 50 tags. For other limits, see Tag Naming and Usage Conventions in the  AWS General Reference.   You can only tag resources that are located in the specified Amazon Web Services Region for the Amazon Web Services account.   To add tags to a resource, you need the necessary permissions for the service that the resource belongs to as well as permissions for adding tags. For more information, see the  documentation for each service.    Do not store personally identifiable information (PII) or other confidential or sensitive information in tags. We use tags to provide you with billing and administration services. Tags are not intended to be  used for private or sensitive data.   Minimum permissions  In addition to the tag:TagResources permission required by this operation, you must also have the tagging permission defined by the service that created the resource. For example,  to tag a ChimeSDKMeetings instance using the TagResources operation, you must have both of the following permissions:  tag:TagResources   ChimeSDKMeetings:CreateTags   Some services might have specific requirements for tagging some resources. For example, to tag an Amazon S3 bucket, you must also have the s3:GetBucketTagging permission.  If the expected minimum permissions don't work, check the documentation for that service's tagging APIs for more information.
    ///   - tenantIds: A consistent and opaque identifier, created and maintained by the builder to represent a segment of their users.
    ///   - logger: Logger use during operation
    @inlinable
    public func createMeeting(
        clientRequestToken: String = CreateMeetingRequest.idempotencyToken(),
        externalMeetingId: String,
        mediaPlacementNetworkType: MediaPlacementNetworkType? = nil,
        mediaRegion: String,
        meetingFeatures: MeetingFeaturesConfiguration? = nil,
        meetingHostId: String? = nil,
        notificationsConfiguration: NotificationsConfiguration? = nil,
        primaryMeetingId: String? = nil,
        tags: [Tag]? = nil,
        tenantIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateMeetingResponse {
        let input = CreateMeetingRequest(
            clientRequestToken: clientRequestToken, 
            externalMeetingId: externalMeetingId, 
            mediaPlacementNetworkType: mediaPlacementNetworkType, 
            mediaRegion: mediaRegion, 
            meetingFeatures: meetingFeatures, 
            meetingHostId: meetingHostId, 
            notificationsConfiguration: notificationsConfiguration, 
            primaryMeetingId: primaryMeetingId, 
            tags: tags, 
            tenantIds: tenantIds
        )
        return try await self.createMeeting(input, logger: logger)
    }

    ///  Creates a new Amazon Chime SDK meeting in the specified media Region, with attendees. For more information about specifying media Regions, see  Available Regions and  Using meeting Regions, both  in the Amazon Chime SDK Developer Guide. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the  Amazon Chime SDK Developer Guide.   If you use this API in conjuction with the  and  APIs, and you don't specify the  MeetingFeatures.Content.MaxResolution or MeetingFeatures.Video.MaxResolution parameters, the following defaults are used:   Content.MaxResolution: FHD   Video.MaxResolution: HD
    @Sendable
    @inlinable
    public func createMeetingWithAttendees(_ input: CreateMeetingWithAttendeesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateMeetingWithAttendeesResponse {
        try await self.client.execute(
            operation: "CreateMeetingWithAttendees", 
            path: "/meetings?operation=create-attendees", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Creates a new Amazon Chime SDK meeting in the specified media Region, with attendees. For more information about specifying media Regions, see  Available Regions and  Using meeting Regions, both  in the Amazon Chime SDK Developer Guide. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the  Amazon Chime SDK Developer Guide.   If you use this API in conjuction with the  and  APIs, and you don't specify the  MeetingFeatures.Content.MaxResolution or MeetingFeatures.Video.MaxResolution parameters, the following defaults are used:   Content.MaxResolution: FHD   Video.MaxResolution: HD
    ///
    /// Parameters:
    ///   - attendees: The attendee information, including attendees' IDs and join tokens.
    ///   - clientRequestToken: The unique identifier for the client request. Use a different token for different meetings.
    ///   - externalMeetingId: The external meeting ID. Pattern: [-_&@+=,(){}\[\]\/«».:|'"#a-zA-Z0-9À-ÿ\s]*  Values that begin with aws: are reserved. You can't configure a value that uses this prefix.  Case insensitive.
    ///   - mediaPlacementNetworkType: The type of network for the media placement. Either IPv4 only or dual-stack (IPv4 and IPv6).
    ///   - mediaRegion: The Region in which to create the meeting.  Available values:  af-south-1,  ap-northeast-1,  ap-northeast-2,  ap-south-1,  ap-southeast-1,  ap-southeast-2,            ca-central-1,  eu-central-1,  eu-north-1,  eu-south-1,  eu-west-1,  eu-west-2,  eu-west-3,             sa-east-1,  us-east-1,  us-east-2,  us-west-1,  us-west-2.  Available values in Amazon Web Services GovCloud (US) Regions: us-gov-east-1, us-gov-west-1.
    ///   - meetingFeatures: Lists the audio and video features enabled for a meeting, such as echo reduction.
    ///   - meetingHostId: Reserved.
    ///   - notificationsConfiguration: The configuration for resource targets to receive notifications when meeting and attendee events occur.
    ///   - primaryMeetingId: When specified, replicates the media from the primary meeting to the new meeting.
    ///   - tags: The tags in the request.
    ///   - tenantIds: A consistent and opaque identifier, created and maintained by the builder to represent a segment of their users.
    ///   - logger: Logger use during operation
    @inlinable
    public func createMeetingWithAttendees(
        attendees: [CreateAttendeeRequestItem],
        clientRequestToken: String = CreateMeetingWithAttendeesRequest.idempotencyToken(),
        externalMeetingId: String,
        mediaPlacementNetworkType: MediaPlacementNetworkType? = nil,
        mediaRegion: String,
        meetingFeatures: MeetingFeaturesConfiguration? = nil,
        meetingHostId: String? = nil,
        notificationsConfiguration: NotificationsConfiguration? = nil,
        primaryMeetingId: String? = nil,
        tags: [Tag]? = nil,
        tenantIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateMeetingWithAttendeesResponse {
        let input = CreateMeetingWithAttendeesRequest(
            attendees: attendees, 
            clientRequestToken: clientRequestToken, 
            externalMeetingId: externalMeetingId, 
            mediaPlacementNetworkType: mediaPlacementNetworkType, 
            mediaRegion: mediaRegion, 
            meetingFeatures: meetingFeatures, 
            meetingHostId: meetingHostId, 
            notificationsConfiguration: notificationsConfiguration, 
            primaryMeetingId: primaryMeetingId, 
            tags: tags, 
            tenantIds: tenantIds
        )
        return try await self.createMeetingWithAttendees(input, logger: logger)
    }

    /// Deletes an attendee from the specified Amazon Chime SDK meeting and deletes their  JoinToken. Attendees are automatically deleted when a Amazon Chime SDK meeting is deleted. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the Amazon Chime Developer Guide.
    @Sendable
    @inlinable
    public func deleteAttendee(_ input: DeleteAttendeeRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "DeleteAttendee", 
            path: "/meetings/{MeetingId}/attendees/{AttendeeId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an attendee from the specified Amazon Chime SDK meeting and deletes their  JoinToken. Attendees are automatically deleted when a Amazon Chime SDK meeting is deleted. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the Amazon Chime Developer Guide.
    ///
    /// Parameters:
    ///   - attendeeId: The Amazon Chime SDK attendee ID.
    ///   - meetingId: The Amazon Chime SDK meeting ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteAttendee(
        attendeeId: String,
        meetingId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = DeleteAttendeeRequest(
            attendeeId: attendeeId, 
            meetingId: meetingId
        )
        return try await self.deleteAttendee(input, logger: logger)
    }

    /// Deletes the specified Amazon Chime SDK meeting. The operation deletes all attendees, disconnects all clients, and prevents new clients from  joining the meeting. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the  Amazon Chime Developer Guide.
    @Sendable
    @inlinable
    public func deleteMeeting(_ input: DeleteMeetingRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "DeleteMeeting", 
            path: "/meetings/{MeetingId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the specified Amazon Chime SDK meeting. The operation deletes all attendees, disconnects all clients, and prevents new clients from  joining the meeting. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the  Amazon Chime Developer Guide.
    ///
    /// Parameters:
    ///   - meetingId: The Amazon Chime SDK meeting ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteMeeting(
        meetingId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = DeleteMeetingRequest(
            meetingId: meetingId
        )
        return try await self.deleteMeeting(input, logger: logger)
    }

    ///  Gets the Amazon Chime SDK attendee details for a specified meeting ID and attendee ID. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the Amazon Chime Developer Guide.
    @Sendable
    @inlinable
    public func getAttendee(_ input: GetAttendeeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetAttendeeResponse {
        try await self.client.execute(
            operation: "GetAttendee", 
            path: "/meetings/{MeetingId}/attendees/{AttendeeId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Gets the Amazon Chime SDK attendee details for a specified meeting ID and attendee ID. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the Amazon Chime Developer Guide.
    ///
    /// Parameters:
    ///   - attendeeId: The Amazon Chime SDK attendee ID.
    ///   - meetingId: The Amazon Chime SDK meeting ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func getAttendee(
        attendeeId: String,
        meetingId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetAttendeeResponse {
        let input = GetAttendeeRequest(
            attendeeId: attendeeId, 
            meetingId: meetingId
        )
        return try await self.getAttendee(input, logger: logger)
    }

    /// Gets the Amazon Chime SDK meeting details for the specified meeting ID. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the Amazon Chime Developer Guide.
    @Sendable
    @inlinable
    public func getMeeting(_ input: GetMeetingRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetMeetingResponse {
        try await self.client.execute(
            operation: "GetMeeting", 
            path: "/meetings/{MeetingId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets the Amazon Chime SDK meeting details for the specified meeting ID. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the Amazon Chime Developer Guide.
    ///
    /// Parameters:
    ///   - meetingId: The Amazon Chime SDK meeting ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func getMeeting(
        meetingId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetMeetingResponse {
        let input = GetMeetingRequest(
            meetingId: meetingId
        )
        return try await self.getMeeting(input, logger: logger)
    }

    ///  Lists the attendees for the specified Amazon Chime SDK meeting. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the Amazon Chime Developer Guide.
    @Sendable
    @inlinable
    public func listAttendees(_ input: ListAttendeesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAttendeesResponse {
        try await self.client.execute(
            operation: "ListAttendees", 
            path: "/meetings/{MeetingId}/attendees", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Lists the attendees for the specified Amazon Chime SDK meeting. For more information about the Amazon Chime SDK, see  Using the Amazon Chime SDK in the Amazon Chime Developer Guide.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - meetingId: The Amazon Chime SDK meeting ID.
    ///   - nextToken: The token to use to retrieve the next page of results.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAttendees(
        maxResults: Int? = nil,
        meetingId: String,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAttendeesResponse {
        let input = ListAttendeesRequest(
            maxResults: maxResults, 
            meetingId: meetingId, 
            nextToken: nextToken
        )
        return try await self.listAttendees(input, logger: logger)
    }

    /// Returns a list of the tags available for the specified resource.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/tags", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of the tags available for the specified resource.
    ///
    /// Parameters:
    ///   - resourceARN: The ARN of the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceARN: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            resourceARN: resourceARN
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Starts transcription for the specified meetingId. For more information, refer to  Using Amazon Chime SDK live transcription in the Amazon Chime SDK Developer Guide. If you specify an invalid configuration, a TranscriptFailed event will be sent with the contents of the BadRequestException generated by Amazon Transcribe.   For more information on each parameter and which combinations are valid, refer to the  StartStreamTranscription API in the  Amazon Transcribe Developer Guide.  By default, Amazon Transcribe may use and store audio content processed by the service to develop and improve Amazon Web Services AI/ML services as  further described in section 50 of the Amazon Web Services Service Terms. Using Amazon Transcribe  may be subject to federal and state laws or regulations regarding the recording or interception of electronic communications. It is your and your end users’  responsibility to comply with all applicable laws regarding the recording, including properly notifying all participants in a recorded session or communication  that the session or communication is being recorded, and obtaining all necessary consents. You can opt out from Amazon Web Services using audio content to develop and  improve AWS AI/ML services by configuring an AI services opt out policy using Amazon Web Services Organizations.
    @Sendable
    @inlinable
    public func startMeetingTranscription(_ input: StartMeetingTranscriptionRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "StartMeetingTranscription", 
            path: "/meetings/{MeetingId}/transcription?operation=start", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts transcription for the specified meetingId. For more information, refer to  Using Amazon Chime SDK live transcription in the Amazon Chime SDK Developer Guide. If you specify an invalid configuration, a TranscriptFailed event will be sent with the contents of the BadRequestException generated by Amazon Transcribe.   For more information on each parameter and which combinations are valid, refer to the  StartStreamTranscription API in the  Amazon Transcribe Developer Guide.  By default, Amazon Transcribe may use and store audio content processed by the service to develop and improve Amazon Web Services AI/ML services as  further described in section 50 of the Amazon Web Services Service Terms. Using Amazon Transcribe  may be subject to federal and state laws or regulations regarding the recording or interception of electronic communications. It is your and your end users’  responsibility to comply with all applicable laws regarding the recording, including properly notifying all participants in a recorded session or communication  that the session or communication is being recorded, and obtaining all necessary consents. You can opt out from Amazon Web Services using audio content to develop and  improve AWS AI/ML services by configuring an AI services opt out policy using Amazon Web Services Organizations.
    ///
    /// Parameters:
    ///   - meetingId: The unique ID of the meeting being transcribed.
    ///   - transcriptionConfiguration: The configuration for the current transcription operation. Must contain EngineTranscribeSettings or  EngineTranscribeMedicalSettings.
    ///   - logger: Logger use during operation
    @inlinable
    public func startMeetingTranscription(
        meetingId: String,
        transcriptionConfiguration: TranscriptionConfiguration,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = StartMeetingTranscriptionRequest(
            meetingId: meetingId, 
            transcriptionConfiguration: transcriptionConfiguration
        )
        return try await self.startMeetingTranscription(input, logger: logger)
    }

    /// Stops transcription for the specified meetingId. For more information, refer to  Using Amazon Chime SDK live transcription in the Amazon Chime SDK Developer Guide.  By default, Amazon Transcribe may use and store audio content processed by the service to develop and improve Amazon Web Services AI/ML services as  further described in section 50 of the Amazon Web Services Service Terms. Using Amazon Transcribe  may be subject to federal and state laws or regulations regarding the recording or interception of electronic communications. It is your and your end users’  responsibility to comply with all applicable laws regarding the recording, including properly notifying all participants in a recorded session or communication  that the session or communication is being recorded, and obtaining all necessary consents. You can opt out from Amazon Web Services using audio content to develop and  improve Amazon Web Services AI/ML services by configuring an AI services opt out policy using Amazon Web Services Organizations.
    @Sendable
    @inlinable
    public func stopMeetingTranscription(_ input: StopMeetingTranscriptionRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "StopMeetingTranscription", 
            path: "/meetings/{MeetingId}/transcription?operation=stop", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Stops transcription for the specified meetingId. For more information, refer to  Using Amazon Chime SDK live transcription in the Amazon Chime SDK Developer Guide.  By default, Amazon Transcribe may use and store audio content processed by the service to develop and improve Amazon Web Services AI/ML services as  further described in section 50 of the Amazon Web Services Service Terms. Using Amazon Transcribe  may be subject to federal and state laws or regulations regarding the recording or interception of electronic communications. It is your and your end users’  responsibility to comply with all applicable laws regarding the recording, including properly notifying all participants in a recorded session or communication  that the session or communication is being recorded, and obtaining all necessary consents. You can opt out from Amazon Web Services using audio content to develop and  improve Amazon Web Services AI/ML services by configuring an AI services opt out policy using Amazon Web Services Organizations.
    ///
    /// Parameters:
    ///   - meetingId: The unique ID of the meeting for which you stop transcription.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopMeetingTranscription(
        meetingId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = StopMeetingTranscriptionRequest(
            meetingId: meetingId
        )
        return try await self.stopMeetingTranscription(input, logger: logger)
    }

    /// The resource that supports tags.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/tags?operation=tag-resource", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// The resource that supports tags.
    ///
    /// Parameters:
    ///   - resourceARN: The ARN of the resource.
    ///   - tags: Lists the requested tags.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceARN: String,
        tags: [Tag],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceARN: resourceARN, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Removes the specified tags from the specified resources. When you specify a tag key, the action removes both that key and its associated value. The operation succeeds even if you  attempt to remove tags from a resource that were already removed. Note the following:   To remove tags from a resource, you need the necessary permissions for the service that the resource belongs to as well as permissions for removing tags. For more information,  see the documentation for the service whose resource you want to untag.   You can only tag resources that are located in the specified Amazon Web Services Region for the calling Amazon Web Services account.    Minimum permissions  In addition to the tag:UntagResources permission required by this operation, you must also have the remove tags permission defined by the service that created the resource.  For example, to remove the tags from an Amazon EC2 instance using the UntagResources operation, you must have both of the following permissions:  tag:UntagResource   ChimeSDKMeetings:DeleteTags
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/tags?operation=untag-resource", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes the specified tags from the specified resources. When you specify a tag key, the action removes both that key and its associated value. The operation succeeds even if you  attempt to remove tags from a resource that were already removed. Note the following:   To remove tags from a resource, you need the necessary permissions for the service that the resource belongs to as well as permissions for removing tags. For more information,  see the documentation for the service whose resource you want to untag.   You can only tag resources that are located in the specified Amazon Web Services Region for the calling Amazon Web Services account.    Minimum permissions  In addition to the tag:UntagResources permission required by this operation, you must also have the remove tags permission defined by the service that created the resource.  For example, to remove the tags from an Amazon EC2 instance using the UntagResources operation, you must have both of the following permissions:  tag:UntagResource   ChimeSDKMeetings:DeleteTags
    ///
    /// Parameters:
    ///   - resourceARN: The ARN of the resource that you're removing tags from.
    ///   - tagKeys: The tag keys being removed from the resources.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceARN: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            resourceARN: resourceARN, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// The capabilities that you want to update.  You use the capabilities with a set of values that control what the capabilities can do, such as SendReceive data. For more information about those values, see  .  When using capabilities, be aware of these corner cases:   If you specify MeetingFeatures:Video:MaxResolution:None when you create a meeting, all API requests  that include SendReceive, Send, or Receive for AttendeeCapabilities:Video will be rejected with ValidationError 400.   If you specify MeetingFeatures:Content:MaxResolution:None when you create a meeting, all API requests that include SendReceive, Send, or  Receive for AttendeeCapabilities:Content will be rejected with ValidationError 400.   You can't set content capabilities to SendReceive or Receive unless you also set video capabilities to SendReceive  or Receive. If you don't set the video capability to receive, the response will contain an HTTP 400 Bad Request status code. However, you can set your video capability  to receive and you set your content capability to not receive.   If meeting features is defined as Video:MaxResolution:None but Content:MaxResolution is defined as something other than None and attendee capabilities are not defined in the API request, then the default attendee video capability is set to Receive and attendee content capability is set to SendReceive. This is because content SendReceive requires video to be at least Receive.   When you change an audio capability from None or Receive to Send or SendReceive ,  and if the attendee left their microphone unmuted, audio will flow from the attendee to the other meeting participants.   When you change a video or content capability from None or Receive to Send or SendReceive ,  and if the attendee turned on their video or content streams, remote attendees can receive those streams, but only after media renegotiation between the client and the Amazon Chime back-end server.
    @Sendable
    @inlinable
    public func updateAttendeeCapabilities(_ input: UpdateAttendeeCapabilitiesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateAttendeeCapabilitiesResponse {
        try await self.client.execute(
            operation: "UpdateAttendeeCapabilities", 
            path: "/meetings/{MeetingId}/attendees/{AttendeeId}/capabilities", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// The capabilities that you want to update.  You use the capabilities with a set of values that control what the capabilities can do, such as SendReceive data. For more information about those values, see  .  When using capabilities, be aware of these corner cases:   If you specify MeetingFeatures:Video:MaxResolution:None when you create a meeting, all API requests  that include SendReceive, Send, or Receive for AttendeeCapabilities:Video will be rejected with ValidationError 400.   If you specify MeetingFeatures:Content:MaxResolution:None when you create a meeting, all API requests that include SendReceive, Send, or  Receive for AttendeeCapabilities:Content will be rejected with ValidationError 400.   You can't set content capabilities to SendReceive or Receive unless you also set video capabilities to SendReceive  or Receive. If you don't set the video capability to receive, the response will contain an HTTP 400 Bad Request status code. However, you can set your video capability  to receive and you set your content capability to not receive.   If meeting features is defined as Video:MaxResolution:None but Content:MaxResolution is defined as something other than None and attendee capabilities are not defined in the API request, then the default attendee video capability is set to Receive and attendee content capability is set to SendReceive. This is because content SendReceive requires video to be at least Receive.   When you change an audio capability from None or Receive to Send or SendReceive ,  and if the attendee left their microphone unmuted, audio will flow from the attendee to the other meeting participants.   When you change a video or content capability from None or Receive to Send or SendReceive ,  and if the attendee turned on their video or content streams, remote attendees can receive those streams, but only after media renegotiation between the client and the Amazon Chime back-end server.
    ///
    /// Parameters:
    ///   - attendeeId: The ID of the attendee associated with the update request.
    ///   - capabilities: The capabilities that you want to update.
    ///   - meetingId: The ID of the meeting associated with the update request.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateAttendeeCapabilities(
        attendeeId: String,
        capabilities: AttendeeCapabilities,
        meetingId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateAttendeeCapabilitiesResponse {
        let input = UpdateAttendeeCapabilitiesRequest(
            attendeeId: attendeeId, 
            capabilities: capabilities, 
            meetingId: meetingId
        )
        return try await self.updateAttendeeCapabilities(input, logger: logger)
    }
}

extension ChimeSDKMeetings {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: ChimeSDKMeetings, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension ChimeSDKMeetings {
    /// Return PaginatorSequence for operation ``listAttendees(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAttendeesPaginator(
        _ input: ListAttendeesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAttendeesRequest, ListAttendeesResponse> {
        return .init(
            input: input,
            command: self.listAttendees,
            inputKey: \ListAttendeesRequest.nextToken,
            outputKey: \ListAttendeesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAttendees(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - meetingId: The Amazon Chime SDK meeting ID.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAttendeesPaginator(
        maxResults: Int? = nil,
        meetingId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAttendeesRequest, ListAttendeesResponse> {
        let input = ListAttendeesRequest(
            maxResults: maxResults, 
            meetingId: meetingId
        )
        return self.listAttendeesPaginator(input, logger: logger)
    }
}

extension ChimeSDKMeetings.ListAttendeesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> ChimeSDKMeetings.ListAttendeesRequest {
        return .init(
            maxResults: self.maxResults,
            meetingId: self.meetingId,
            nextToken: token
        )
    }
}
